<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Lisp 入门 | Guru Note</title>
    <meta name="generator" content="VuePress 1.7.1">
    <link rel="stylesheet" href="./font/index.css">
    <script src="/docs/icon/svg.js"></script>
    <meta name="description" content="Sea of dawn">
    
    <link rel="preload" href="/docs/assets/css/0.styles.efa081cd.css" as="style"><link rel="preload" href="/docs/assets/js/app.cdec4db9.js" as="script"><link rel="preload" href="/docs/assets/js/2.993bd611.js" as="script"><link rel="preload" href="/docs/assets/js/30.f2233269.js" as="script"><link rel="preload" href="/docs/assets/js/7.5a12abef.js" as="script"><link rel="prefetch" href="/docs/assets/js/10.c3177bdb.js"><link rel="prefetch" href="/docs/assets/js/100.60c23478.js"><link rel="prefetch" href="/docs/assets/js/101.7ea29e1b.js"><link rel="prefetch" href="/docs/assets/js/102.7f47e485.js"><link rel="prefetch" href="/docs/assets/js/103.ea9ce400.js"><link rel="prefetch" href="/docs/assets/js/104.4ec6a518.js"><link rel="prefetch" href="/docs/assets/js/105.75526347.js"><link rel="prefetch" href="/docs/assets/js/106.01f6b03b.js"><link rel="prefetch" href="/docs/assets/js/107.69fe0811.js"><link rel="prefetch" href="/docs/assets/js/108.fa23768b.js"><link rel="prefetch" href="/docs/assets/js/109.90df1698.js"><link rel="prefetch" href="/docs/assets/js/11.54347528.js"><link rel="prefetch" href="/docs/assets/js/110.dd8d7227.js"><link rel="prefetch" href="/docs/assets/js/111.ccf25ceb.js"><link rel="prefetch" href="/docs/assets/js/112.6963298f.js"><link rel="prefetch" href="/docs/assets/js/113.30ceb3d8.js"><link rel="prefetch" href="/docs/assets/js/114.42ef6603.js"><link rel="prefetch" href="/docs/assets/js/115.f1db7817.js"><link rel="prefetch" href="/docs/assets/js/116.92971223.js"><link rel="prefetch" href="/docs/assets/js/117.c5a65e7e.js"><link rel="prefetch" href="/docs/assets/js/118.e329035d.js"><link rel="prefetch" href="/docs/assets/js/119.cbb17c5e.js"><link rel="prefetch" href="/docs/assets/js/12.c8144ee8.js"><link rel="prefetch" href="/docs/assets/js/120.8537f6a6.js"><link rel="prefetch" href="/docs/assets/js/121.257d3851.js"><link rel="prefetch" href="/docs/assets/js/122.96a5f921.js"><link rel="prefetch" href="/docs/assets/js/123.2220fd12.js"><link rel="prefetch" href="/docs/assets/js/124.552b1a29.js"><link rel="prefetch" href="/docs/assets/js/125.4e36fe37.js"><link rel="prefetch" href="/docs/assets/js/126.3939cdcc.js"><link rel="prefetch" href="/docs/assets/js/127.014df434.js"><link rel="prefetch" href="/docs/assets/js/13.edc237a8.js"><link rel="prefetch" href="/docs/assets/js/14.66270d4f.js"><link rel="prefetch" href="/docs/assets/js/15.0804164b.js"><link rel="prefetch" href="/docs/assets/js/16.dec928ab.js"><link rel="prefetch" href="/docs/assets/js/17.bbfc90a8.js"><link rel="prefetch" href="/docs/assets/js/18.76904860.js"><link rel="prefetch" href="/docs/assets/js/19.80a98011.js"><link rel="prefetch" href="/docs/assets/js/20.c39e42bd.js"><link rel="prefetch" href="/docs/assets/js/21.287b744a.js"><link rel="prefetch" href="/docs/assets/js/22.c9506be7.js"><link rel="prefetch" href="/docs/assets/js/23.9732a229.js"><link rel="prefetch" href="/docs/assets/js/24.21ed1f05.js"><link rel="prefetch" href="/docs/assets/js/25.8f1926f6.js"><link rel="prefetch" href="/docs/assets/js/26.61b6eb9f.js"><link rel="prefetch" href="/docs/assets/js/27.3706753c.js"><link rel="prefetch" href="/docs/assets/js/28.b6b182cf.js"><link rel="prefetch" href="/docs/assets/js/29.ae979ad9.js"><link rel="prefetch" href="/docs/assets/js/3.a7f8dd77.js"><link rel="prefetch" href="/docs/assets/js/31.06780314.js"><link rel="prefetch" href="/docs/assets/js/32.2dad91d1.js"><link rel="prefetch" href="/docs/assets/js/33.87ec6e22.js"><link rel="prefetch" href="/docs/assets/js/34.7b75f220.js"><link rel="prefetch" href="/docs/assets/js/35.3184991f.js"><link rel="prefetch" href="/docs/assets/js/36.28248fbe.js"><link rel="prefetch" href="/docs/assets/js/37.5824a979.js"><link rel="prefetch" href="/docs/assets/js/38.99a364fe.js"><link rel="prefetch" href="/docs/assets/js/39.a5f43732.js"><link rel="prefetch" href="/docs/assets/js/4.a55d89ed.js"><link rel="prefetch" href="/docs/assets/js/40.629f78f7.js"><link rel="prefetch" href="/docs/assets/js/41.e4f58d1c.js"><link rel="prefetch" href="/docs/assets/js/42.9f41aa47.js"><link rel="prefetch" href="/docs/assets/js/43.636412b6.js"><link rel="prefetch" href="/docs/assets/js/44.3b491aef.js"><link rel="prefetch" href="/docs/assets/js/45.77df19bc.js"><link rel="prefetch" href="/docs/assets/js/46.01f53ddd.js"><link rel="prefetch" href="/docs/assets/js/47.476e85c9.js"><link rel="prefetch" href="/docs/assets/js/48.198502dc.js"><link rel="prefetch" href="/docs/assets/js/49.0d59d332.js"><link rel="prefetch" href="/docs/assets/js/5.1597c0f8.js"><link rel="prefetch" href="/docs/assets/js/50.02baf101.js"><link rel="prefetch" href="/docs/assets/js/51.c9fbd54d.js"><link rel="prefetch" href="/docs/assets/js/52.4cb4459b.js"><link rel="prefetch" href="/docs/assets/js/53.248450d7.js"><link rel="prefetch" href="/docs/assets/js/54.83f12d1e.js"><link rel="prefetch" href="/docs/assets/js/55.b18accba.js"><link rel="prefetch" href="/docs/assets/js/56.8a160b09.js"><link rel="prefetch" href="/docs/assets/js/57.b854a940.js"><link rel="prefetch" href="/docs/assets/js/58.4500f315.js"><link rel="prefetch" href="/docs/assets/js/59.59400e36.js"><link rel="prefetch" href="/docs/assets/js/6.887ba020.js"><link rel="prefetch" href="/docs/assets/js/60.4dd5b5bb.js"><link rel="prefetch" href="/docs/assets/js/61.50d8c8f6.js"><link rel="prefetch" href="/docs/assets/js/62.17d10daa.js"><link rel="prefetch" href="/docs/assets/js/63.d5f821cc.js"><link rel="prefetch" href="/docs/assets/js/64.7bf2519f.js"><link rel="prefetch" href="/docs/assets/js/65.0a1c9bc8.js"><link rel="prefetch" href="/docs/assets/js/66.1bcaa81c.js"><link rel="prefetch" href="/docs/assets/js/67.326bdf9b.js"><link rel="prefetch" href="/docs/assets/js/68.2b3b63b2.js"><link rel="prefetch" href="/docs/assets/js/69.c9b1a1a9.js"><link rel="prefetch" href="/docs/assets/js/70.a5fede78.js"><link rel="prefetch" href="/docs/assets/js/71.288d9643.js"><link rel="prefetch" href="/docs/assets/js/72.8665d6b8.js"><link rel="prefetch" href="/docs/assets/js/73.47155429.js"><link rel="prefetch" href="/docs/assets/js/74.4d4738f8.js"><link rel="prefetch" href="/docs/assets/js/75.659a325f.js"><link rel="prefetch" href="/docs/assets/js/76.a263f692.js"><link rel="prefetch" href="/docs/assets/js/77.9d86d59e.js"><link rel="prefetch" href="/docs/assets/js/78.a41b5d88.js"><link rel="prefetch" href="/docs/assets/js/79.5d0fc4cc.js"><link rel="prefetch" href="/docs/assets/js/8.80d0c81d.js"><link rel="prefetch" href="/docs/assets/js/80.01a11f6a.js"><link rel="prefetch" href="/docs/assets/js/81.9c0207d9.js"><link rel="prefetch" href="/docs/assets/js/82.12be8e04.js"><link rel="prefetch" href="/docs/assets/js/83.00fa5f46.js"><link rel="prefetch" href="/docs/assets/js/84.f14cd53c.js"><link rel="prefetch" href="/docs/assets/js/85.e9d7c0d1.js"><link rel="prefetch" href="/docs/assets/js/86.eb78fbbf.js"><link rel="prefetch" href="/docs/assets/js/87.8a31f5ae.js"><link rel="prefetch" href="/docs/assets/js/88.0f10e6dc.js"><link rel="prefetch" href="/docs/assets/js/89.a17253c9.js"><link rel="prefetch" href="/docs/assets/js/9.2fa568cb.js"><link rel="prefetch" href="/docs/assets/js/90.e56bc609.js"><link rel="prefetch" href="/docs/assets/js/91.5277db18.js"><link rel="prefetch" href="/docs/assets/js/92.b0bb8aa7.js"><link rel="prefetch" href="/docs/assets/js/93.cd790b77.js"><link rel="prefetch" href="/docs/assets/js/94.76bbe227.js"><link rel="prefetch" href="/docs/assets/js/95.4f07ca32.js"><link rel="prefetch" href="/docs/assets/js/96.2b1e8485.js"><link rel="prefetch" href="/docs/assets/js/97.e93b3461.js"><link rel="prefetch" href="/docs/assets/js/98.658063a1.js"><link rel="prefetch" href="/docs/assets/js/99.a3642e6d.js">
    <link rel="stylesheet" href="/docs/assets/css/0.styles.efa081cd.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/docs/" class="home-link router-link-active"><!----> <span class="site-name">Guru Note</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----> <svg aria-hidden="true" class="icon search-icon"><use xlink:href="#icon-search"></use></svg></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/docs/layout/" class="nav-link">
  CSS 手册
</a></div><div class="nav-item"><a href="/docs/js/" class="nav-link">
  JavaScript
</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端进阶" class="dropdown-title"><span class="title">前端进阶</span> <span class="arrow down"></span></button> <button type="button" aria-label="前端进阶" class="mobile-dropdown-title"><span class="title">前端进阶</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
          前端框架
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/docs/vue/" class="nav-link">
  Vue.js
</a></li><li class="dropdown-subitem"><a href="/docs/react/" class="nav-link">
  React.js
</a></li></ul></li><li class="dropdown-item"><h4>
          拓展语言
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/docs/node/" class="nav-link">
  Node.js
</a></li><li class="dropdown-subitem"><a href="/docs/ts/" class="nav-link">
  TypeScript
</a></li></ul></li></ul></div></div><div class="nav-item"><a href="/docs/devbook/" class="nav-link router-link-active">
  开发手册
</a></div><div class="nav-item"><a href="/docs/exam/" class="nav-link">
  金九银十
</a></div><div class="nav-item"><a href="/docs/message/" class="nav-link">
  留言板
</a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><div class="el-scrollbar"><div class="scrollbar-wrapper el-scrollbar__wrap el-scrollbar__wrap--hidden-default"><div class="el-scrollbar__view"><nav class="nav-links"><div class="nav-item"><a href="/docs/layout/" class="nav-link">
  CSS 手册
</a></div><div class="nav-item"><a href="/docs/js/" class="nav-link">
  JavaScript
</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端进阶" class="dropdown-title"><span class="title">前端进阶</span> <span class="arrow down"></span></button> <button type="button" aria-label="前端进阶" class="mobile-dropdown-title"><span class="title">前端进阶</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
          前端框架
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/docs/vue/" class="nav-link">
  Vue.js
</a></li><li class="dropdown-subitem"><a href="/docs/react/" class="nav-link">
  React.js
</a></li></ul></li><li class="dropdown-item"><h4>
          拓展语言
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/docs/node/" class="nav-link">
  Node.js
</a></li><li class="dropdown-subitem"><a href="/docs/ts/" class="nav-link">
  TypeScript
</a></li></ul></li></ul></div></div><div class="nav-item"><a href="/docs/devbook/" class="nav-link router-link-active">
  开发手册
</a></div><div class="nav-item"><a href="/docs/exam/" class="nav-link">
  金九银十
</a></div><div class="nav-item"><a href="/docs/message/" class="nav-link">
  留言板
</a></div> <!----></nav>  <ul class="sidebar-links"><li><a href="/docs/devbook/" aria-current="page" class="sidebar-link">介绍</a></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>开发者小记</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/docs/devbook/note/regex-getting-started.html" class="sidebar-link">正则表达式入门</a></li><li><a href="/docs/devbook/note/lisp-getting-started.html" aria-current="page" class="active sidebar-link">Lisp 入门</a></li><li><a href="/docs/devbook/note/search-skill.html" class="sidebar-link">搜索引擎常用技巧</a></li><li><a href="/docs/devbook/note/the-http.html" class="sidebar-link">HTTP 相关知识科普</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>环境搭建</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/docs/devbook/setting/node-use.html" class="sidebar-link">Node.js 安装教程</a></li><li><a href="/docs/devbook/setting/cmder-install.html" class="sidebar-link">Cmder 配置教程</a></li><li><a href="/docs/devbook/setting/vscode-and-cmder-use.html" class="sidebar-link">VSCode 与 Cmder 配合使用</a></li><li><a href="/docs/devbook/setting/tool-recommend.html" class="sidebar-link">Windows 常用工具</a></li><li><a href="/docs/devbook/setting/webstorm.html" class="sidebar-link">WebStorm 配置</a></li><li><a href="/docs/devbook/setting/vscode.html" class="sidebar-link">VSCode 配置</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>命令行工具</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/docs/devbook/cli-plugin.html" class="sidebar-link">命令行常用插件</a></li><li><a href="/docs/devbook/cli-hot-key.html" class="sidebar-link">命令行快捷键</a></li><li><a href="/docs/devbook/git-getting-started.html" class="sidebar-link">Git 命令入门</a></li><li><a href="/docs/devbook/git-many-remotely.html" class="sidebar-link">Git 关联多个远程仓库</a></li><li><a href="/docs/devbook/mobile-file.html" class="sidebar-link">文件操作命令</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>博客搭建</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/docs/devbook/hexo-build-blog.html" class="sidebar-link">Hexo 搭建博客教程</a></li><li><a href="/docs/devbook/hexo-generate.html" class="sidebar-link">Hexo 生成永久链接</a></li><li><a href="/docs/devbook/hexo-theme.html" class="sidebar-link">Hexo 主题推荐</a></li><li><a href="/docs/devbook/hugo-created-blog.html" class="sidebar-link">Hugo 搭建个人博客</a></li></ul></section></li></ul> </div></div><div class="el-scrollbar__bar is-horizontal"><div class="el-scrollbar__thumb" style="width:0;transform:translateX(0%);ms-transform:translateX(0%);webkit-transform:translateX(0%);"></div></div><div class="el-scrollbar__bar is-vertical"><div class="el-scrollbar__thumb" style="height:0;transform:translateY(0%);ms-transform:translateY(0%);webkit-transform:translateY(0%);"></div></div></div></aside> <main class="page"> <div class="re-page-top"><h1 class="title"><span>Lisp 入门</span></h1> <div class="re-page-index"><div class="page-index-title"><span class="open-catalog"><svg aria-hidden="true" class="icon arrow-right"><use xlink:href="#icon-bold-right"></use></svg> <span class="text">目录</span></span></div> <div class="page-index-content"><div class="page-catalog" style="display:none;"><div class="synopsis-wrap"><ul class="synopsis-ul"><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#运行-scheme" class="synopsis-link">运行 Scheme</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#drracket-的使用" class="synopsis-link">DrRacket 的使用</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#lisp-的基本语法" class="synopsis-link">Lisp 的基本语法</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#条件判断" class="synopsis-link">条件判断</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#或且非" class="synopsis-link">或且非</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#词法作用域" class="synopsis-link">词法作用域</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#线性递归-线性迭代" class="synopsis-link">线性递归&amp;线性迭代</a><ul class="synopsis-ul"><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#以线性递归的方式实现阶乘" class="synopsis-link">以线性递归的方式实现阶乘</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#以线性迭代的方式实现阶乘" class="synopsis-link">以线性迭代的方式实现阶乘</a></li><li class="synopsis-li"><a href="/docs/devbook/note/lisp-getting-started.html#注意" class="synopsis-link">注意</a></li></ul></li></ul></div></div></div></div></div> <div class="theme-default-content content__default"><h2 id="运行-scheme"><a href="#运行-scheme" class="header-anchor">#</a> 运行 Scheme</h2> <p>Scheme 是 Lisp 的方言版本。</p> <ol><li><p>下载 <a href="https://download.racket-lang.org/" target="_blank" rel="noopener noreferrer">Racket<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> 来运行 Scheme。</p></li> <li><p>下载后打开 DrRacket 选择 Language &gt; 选择 Choose Language
</p><details class="details-image"><summary>图片</summary> <img src="/docs/images/lisp-01.png" alt="foo"></details><p></p></li> <li><p>选择 Beginning Student（初学者模式），点击 OK。
</p><details class="details-image"><summary>图片</summary> <img src="/docs/images/lisp-02.png" alt="foo"></details><p></p></li></ol> <h2 id="drracket-的使用"><a href="#drracket-的使用" class="header-anchor">#</a> DrRacket 的使用</h2> <p>DrRacket 的上半部分负责命名，下半部分负责运算。上半部分修改后需要重新 run 才会生效。</p> <details class="details-image"><summary>图片</summary> <img src="/docs/images/lisp-03.png" alt="foo"></details> <h2 id="lisp-的基本语法"><a href="#lisp-的基本语法" class="header-anchor">#</a> Lisp 的基本语法</h2> <p>注释写法</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">+</span> <span class="token number">1</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token comment">; 1+1 分号后就是注释</span>
</code></pre></div><p>简单的四则运算</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">+</span> <span class="token number">1</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 1+2</span>
<span class="token punctuation">(</span><span class="token car">-</span> <span class="token number">3</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 3-2</span>
<span class="token punctuation">(</span><span class="token car">*</span> <span class="token number">4</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token comment">; 4*5</span>
<span class="token punctuation">(</span><span class="token car">/</span> <span class="token number">6</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 6/2</span>
</code></pre></div><p>四则运算升级</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">+</span> <span class="token number">1</span> <span class="token number">2</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token comment">; 1+2+3</span>
<span class="token punctuation">(</span><span class="token car">-</span> <span class="token number">3</span> <span class="token number">2</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token comment">; 3-2-1</span>
<span class="token punctuation">(</span><span class="token car">*</span> <span class="token number">4</span> <span class="token number">5</span> <span class="token number">6</span><span class="token punctuation">)</span><span class="token comment">; 4*5*6</span>
<span class="token punctuation">(</span><span class="token car">/</span> <span class="token number">6</span> <span class="token number">2</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token comment">; 6/2/3</span>
</code></pre></div><p>小数</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">+</span> <span class="token number">1.5</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 3.5</span>
.1       <span class="token comment">; 0.1</span>
</code></pre></div><p>更复杂的运算</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">+</span> <span class="token punctuation">(</span><span class="token car">*</span> <span class="token number">3</span> <span class="token punctuation">(</span> + <span class="token punctuation">(</span><span class="token car">*</span> <span class="token number">2</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">+</span> <span class="token number">3</span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">+</span> <span class="token punctuation">(</span><span class="token car">-</span> <span class="token number">10</span> <span class="token number">6</span><span class="token punctuation">)</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
</code></pre></div><p>如果觉得看起来乱，可以将上面的语法用树形结构书写</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">+</span> 
  <span class="token punctuation">(</span><span class="token car">*</span> <span class="token number">3</span>
    <span class="token punctuation">(</span> +
      <span class="token punctuation">(</span><span class="token car">*</span> <span class="token number">2</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">+</span> <span class="token number">3</span> <span class="token number">5</span><span class="token punctuation">)</span>
    <span class="token punctuation">)</span>
  <span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token car">+</span> <span class="token punctuation">(</span><span class="token car">-</span> <span class="token number">10</span> <span class="token number">6</span><span class="token punctuation">)</span> <span class="token number">7</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span>
</code></pre></div><p>命名（很像变量）声明一个数字</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> x <span class="token number">10</span><span class="token punctuation">)</span>
<span class="token punctuation">(</span><span class="token car">*</span> x <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 20</span>
</code></pre></div><p>复合过程（很像函数）求两个数的平方</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">square</span> n<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">*</span> n n<span class="token punctuation">)</span> <span class="token punctuation">)</span>
<span class="token punctuation">(</span><span class="token car">square</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token comment">; 100</span>
</code></pre></div><p>还可以结合上面的例子实现求一个数的平方和</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">sum-of-square</span> x y<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">+</span> <span class="token punctuation">(</span><span class="token car">square</span> x<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">square</span> y<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">(</span><span class="token car">sum-of-square</span> <span class="token number">3</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token comment">; 25</span>
</code></pre></div><p>代入法</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">f</span> a<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">sum-of-square</span> <span class="token punctuation">(</span><span class="token car">+</span> a <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">*</span> a <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">(</span><span class="token car">f</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token comment">; 136</span>
</code></pre></div><p>上面的代入法求值有两种计算过程</p> <ol><li>应用序（参数先求值，再代入过程）</li> <li>正常序（参数不求值，全部代入，最后求值）</li></ol> <h2 id="条件判断"><a href="#条件判断" class="header-anchor">#</a> 条件判断</h2> <p>在 Lisp 中，条件判断可以这么写，假如我们要求一个数的绝对值：</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> x <span class="token punctuation">(</span><span class="token car">-</span> <span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">(</span><span class="token keyword">cond</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token car">&gt;</span> x <span class="token number">0</span><span class="token punctuation">)</span> x<span class="token punctuation">)</span>
      <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token car">=</span> x <span class="token number">0</span><span class="token punctuation">)</span> <span class="token number">0</span><span class="token punctuation">)</span>
      <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token car">&lt;</span> x <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">-</span> x<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>
<span class="token comment">; 结果: 6</span>
</code></pre></div><p>可以将它封装起来</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">my-abs</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token keyword">cond</span>
    <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token car">&gt;</span> n <span class="token number">0</span><span class="token punctuation">)</span> n<span class="token punctuation">)</span>
    <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token car">=</span> n <span class="token number">0</span><span class="token punctuation">)</span> <span class="token number">0</span><span class="token punctuation">)</span>
    <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token car">&lt;</span> n <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">-</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span>
<span class="token comment">; 这样就可以执行</span>
<span class="token punctuation">(</span><span class="token car">my-abs</span> <span class="token punctuation">(</span><span class="token car">-</span> <span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">; 6</span>
</code></pre></div><p>还可以使用 if 来实现</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">my-abs</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token car">&gt;</span> n <span class="token number">0</span><span class="token punctuation">)</span> n <span class="token punctuation">(</span><span class="token car">-</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</code></pre></div><p>它的意思是，如果 n &gt; 0 就返回 n，否则就返回 <code>-n</code></p> <h2 id="或且非"><a href="#或且非" class="header-anchor">#</a> 或且非</h2> <p>在 Lisp 中：or 为或，and 为且，not 为非。</p> <p>使用 or 判断一个数为 2 或 5，是就返回 1，否则就返回 0 。</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">assign-or</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token keyword">if</span>
    <span class="token punctuation">(</span><span class="token keyword">or</span> <span class="token punctuation">(</span><span class="token car">=</span> n <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">=</span> n <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token number">1</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">; 测试</span>
<span class="token punctuation">(</span><span class="token car">assign-or</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token comment">; 0</span>
<span class="token punctuation">(</span><span class="token car">assign-or</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 1</span>
</code></pre></div><p>使用 and 判断一个数是否在 1-9 之间，是就返回 1 ，否就返回 0 。</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">small-number</span> n<span class="token punctuation">)</span> 
  <span class="token punctuation">(</span><span class="token keyword">if</span>
    <span class="token punctuation">(</span><span class="token keyword">and</span> <span class="token punctuation">(</span><span class="token car">&gt;=</span> n <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">&lt;=</span> n <span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token number">1</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">; 测试</span>
<span class="token punctuation">(</span><span class="token car">small-number</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token comment">; 0</span>
<span class="token punctuation">(</span><span class="token car">small-number</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 1</span>
<span class="token punctuation">(</span><span class="token car">small-number</span> <span class="token number">9</span><span class="token punctuation">)</span><span class="token comment">; 1</span>
</code></pre></div><p>使用 not 判断一个数是否为大于 0 的数，是就返回 1，否则就返回 0 。</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">assign-not</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token keyword">if</span>
    <span class="token punctuation">(</span><span class="token keyword">not</span> <span class="token punctuation">(</span><span class="token car">&lt;=</span> n <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token number">1</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">; 测试</span>
<span class="token punctuation">(</span><span class="token car">assign-not</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token comment">; 1</span>
<span class="token punctuation">(</span><span class="token car">assign-not</span> <span class="token number">0.1</span><span class="token punctuation">)</span><span class="token comment">; 1</span>
<span class="token punctuation">(</span><span class="token car">assign-not</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token comment">; 0</span>
</code></pre></div><p>求一个数的平方根</p> <p>使用 JavaScript 实现</p> <div class="language-js extra-class"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">root</span><span class="token punctuation">(</span><span class="token parameter">n</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token function">盲猜</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
<span class="token punctuation">}</span>

<span class="token keyword">function</span> <span class="token function">盲猜</span><span class="token punctuation">(</span><span class="token parameter">x<span class="token punctuation">,</span> n</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span><span class="token punctuation">(</span>Math<span class="token punctuation">.</span><span class="token function">abs</span><span class="token punctuation">(</span>x<span class="token operator">*</span>x <span class="token operator">-</span> n<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0.001</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
    <span class="token keyword">return</span> x
  <span class="token punctuation">}</span>
  <span class="token keyword">const</span> y <span class="token operator">=</span> n<span class="token operator">/</span>x
  <span class="token keyword">return</span> <span class="token function">盲猜</span><span class="token punctuation">(</span><span class="token punctuation">(</span>x<span class="token operator">+</span>y<span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
<span class="token punctuation">}</span>

<span class="token function">root</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment">// 1.4142156862745097</span>
</code></pre></div><div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">root</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token car">guess</span> <span class="token number">1</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">guess</span> x n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token keyword">if</span>
    <span class="token punctuation">(</span><span class="token car">&lt;</span>
      <span class="token punctuation">(</span><span class="token car">abs</span>
        <span class="token punctuation">(</span><span class="token car">-</span> <span class="token punctuation">(</span><span class="token car">*</span> x x<span class="token punctuation">)</span> n<span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token number">0.001</span> <span class="token punctuation">)</span>
    x
    <span class="token punctuation">(</span><span class="token car">guess</span>
      <span class="token punctuation">(</span><span class="token car">/</span>
        <span class="token punctuation">(</span><span class="token car">+</span>
          <span class="token punctuation">(</span><span class="token car">/</span> n x<span class="token punctuation">)</span> x <span class="token punctuation">)</span> <span class="token number">2</span> <span class="token punctuation">)</span> n <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span>
<span class="token comment">; 测试</span>
<span class="token punctuation">(</span><span class="token car">root</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token comment">; 1.4142156862745098039</span>
</code></pre></div><h2 id="词法作用域"><a href="#词法作用域" class="header-anchor">#</a> 词法作用域</h2> <p>在 Lisp 中 如果define 中定义了 define 并且引用最外层 define 的值，就叫词法作用域（在本文的 DrRacket 中不支持）。</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">lexical</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">childer</span> x<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">x</span> * n<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span>
</code></pre></div><h2 id="线性递归-线性迭代"><a href="#线性递归-线性迭代" class="header-anchor">#</a> 线性递归&amp;线性迭代</h2> <h3 id="以线性递归的方式实现阶乘"><a href="#以线性递归的方式实现阶乘" class="header-anchor">#</a> 以线性递归的方式实现阶乘</h3> <p>使用 JavaScript</p> <div class="language-js extra-class"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">f</span><span class="token punctuation">(</span><span class="token parameter">n</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>n <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token number">1</span> <span class="token punctuation">}</span>
  <span class="token keyword">return</span> n <span class="token operator">*</span> <span class="token function">f</span><span class="token punctuation">(</span>n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token function">f</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token comment">// 120</span>
</code></pre></div><p>使用 Lisp</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">f</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token keyword">if</span>
    <span class="token punctuation">(</span><span class="token car">=</span> n <span class="token number">1</span><span class="token punctuation">)</span> <span class="token number">1</span>
    <span class="token punctuation">(</span><span class="token car">*</span> n <span class="token punctuation">(</span><span class="token car">f</span> <span class="token punctuation">(</span><span class="token car">-</span> n <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
   <span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">; 测试</span>
<span class="token punctuation">(</span><span class="token car">f</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token comment">; 120</span>
</code></pre></div><p>Lisp 的线性递归示意图</p> <img src="/docs/images/linear-recursion.png" alt="foo"> <h3 id="以线性迭代的方式实现阶乘"><a href="#以线性迭代的方式实现阶乘" class="header-anchor">#</a> 以线性迭代的方式实现阶乘</h3> <p>使用 JavaScript</p> <div class="language-js extra-class"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">f</span><span class="token punctuation">(</span><span class="token parameter">n</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token function">迭代</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token keyword">function</span> <span class="token function">迭代</span><span class="token punctuation">(</span><span class="token parameter">i<span class="token punctuation">,</span> result<span class="token punctuation">,</span> n</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">&gt;</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> result <span class="token punctuation">}</span>
  <span class="token keyword">return</span> <span class="token function">迭代</span><span class="token punctuation">(</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> i <span class="token operator">*</span> result<span class="token punctuation">,</span> n<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token function">f</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span> <span class="token comment">// 720</span>
</code></pre></div><p>使用 Lisp</p> <div class="language-lisp extra-class"><pre class="language-lisp"><code><span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">f</span> n<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">iterator</span> <span class="token number">1</span> <span class="token number">1</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">(</span><span class="token car">define</span> <span class="token punctuation">(</span><span class="token car">iterator</span> i result n<span class="token punctuation">)</span>
  <span class="token punctuation">(</span><span class="token keyword">if</span> 
    <span class="token punctuation">(</span><span class="token car">&gt;</span> i n<span class="token punctuation">)</span>
    result
    <span class="token punctuation">(</span><span class="token car">iterator</span> <span class="token punctuation">(</span><span class="token car">+</span> i <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">*</span> i result<span class="token punctuation">)</span> n<span class="token punctuation">)</span>
  <span class="token punctuation">)</span>
<span class="token punctuation">)</span>
<span class="token comment">; 测试</span>
<span class="token punctuation">(</span><span class="token car">f</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token comment">; 120</span>
</code></pre></div><h3 id="注意"><a href="#注意" class="header-anchor">#</a> 注意</h3> <p>线性递归和线性迭代都是「递归」</p> <ul><li>线性递归和线性迭代强调的是「计算过程」</li> <li>「递归」表示函数调用自己这种「形式」</li></ul></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新：</span><span class="time">2021-03-06 10:32</span></div></footer> <div class="page-nav"><p class="inner"><span class="prev"><svg aria-hidden="true" class="icon"><use xlink:href="#icon-left"></use></svg> <a href="/docs/devbook/note/regex-getting-started.html" class="prev">正则表达式入门</a></span> <span class="next"><a href="/docs/devbook/note/search-skill.html">搜索引擎常用技巧</a> <svg aria-hidden="true" class="icon"><use xlink:href="#icon-right"></use></svg></span></p></div> </main></div><div class="global-ui"><!----><!----></div></div>
    <script src="/docs/assets/js/app.cdec4db9.js" defer></script><script src="/docs/assets/js/2.993bd611.js" defer></script><script src="/docs/assets/js/30.f2233269.js" defer></script><script src="/docs/assets/js/7.5a12abef.js" defer></script>
  </body>
</html>
